<?php
/**
 * 业务相关助手函数
 * Created by Vscode
 * User: ChenP
 * Date: 2021-12-03 17:00
 */
declare(strict_types=1);

if (! function_exists('auth')) {
    /**
     * 获取用户信息
     *
     * @return array|null
     */
    function auth(): ?array
    {
        return request()->getAttribute('user');
    }
}

if (! function_exists('base64_urlsafe_encode')) {
    /**
     * 对提供的数据进行urlsafe的base64编码。
     *
     * @param string $data 待编码的数据，一般为字符串
     *
     * @return string 编码后的字符串
     * @link http://developer.qiniu.com/docs/v6/api/overview/appendix.html#urlsafe-base64
     */
    function base64_urlsafe_encode($data)
    {
        $find = array('+', '/');
        $replace = array('-', '_');
        return str_replace($find, $replace, base64_encode($data));
    }
}

if (! function_exists('base64_urlsafe_decode')) {
    /**
     * 对提供的urlsafe的base64编码的数据进行解码
     *
     * @param string $str 待解码的数据，一般为字符串
     *
     * @return string 解码后的字符串
     */
    function base64_urlsafe_decode($str)
    {
        $find = array('-', '_');
        $replace = array('+', '/');
        return base64_decode(str_replace($find, $replace, $str));
    }
}

if (! function_exists('aes_encrypt')) {
    function aes_encrypt($data){
        if (is_array($data)) {
            $str = json_encode($data, 256);
        } elseif (is_object($data)) {
            $str = json_encode($data, JSON_FORCE_OBJECT);
        } else {
            $str = $data;
        }
        return base64_urlsafe_encode(openssl_encrypt($str, env('AES_METHOD'),env('AES_KEY'), OPENSSL_RAW_DATA, env('AES_IV')));
    }
}

if (! function_exists('aes_decrypt')) {
    function aes_decrypt($str){
        $data = openssl_decrypt(base64_urlsafe_decode(trim($str)), env('AES_METHOD'), env('AES_KEY'), OPENSSL_RAW_DATA, env('AES_IV'));
        $decodeData = [];
        if($data && is_string($data))
        {
            $decodeData = json_decode($data, true);
        }

        return $decodeData;
    }
}

if (! function_exists('fetch_request_data_by_env')) {
    /**
     * 通过环境变量决定如何获取请求数据 （此时的数据为解密的数据）
     *
     * @return array|false|mixed|string
     */
    function fetch_request_data_by_env()
    {
        $enableEncryptSchema = config('app.enable_encrypt_schema');  // 是否开启了加密参数模式
        $requestIns = request();
        $input = [];
        if (! $enableEncryptSchema) {
            // $input = $requestIns->all();
            $input = array_merge_recursive($requestIns->all(), $requestIns->getUploadedFiles());
        } elseif ($requestIns->has('data')) {  // 此时，前端传过来的值是经过加密的
            $encryptStrData = $requestIns->input('data');  // 加密后的数据
            $input = aes_decrypt($encryptStrData);  // 解密后的数据
        }
        $input = empty($input) ? [] : $input;
        return $input;
    }
}

if (! function_exists('fetch_response_data_by_env')) {
    /**
     * 通过环境变量决定如何获取返回数据 （除了本地开发模式且开启了 debug 模式以外，都会返回经过加密的字符串）
     *
     * @param $data
     * @return array|false|mixed|string
     */
    function fetch_response_data_by_env($data)
    {
        $result = [];
        $enableEncryptSchema = config('app.enable_encrypt_schema');  // 是否开启了加密参数模式
        if (! $enableEncryptSchema) {
            $result = $data;
        } else {  // 此时，需要把返回结果通过加密后返回给前端
            $result = aes_encrypt($data);  // 这里返回的是经过加密后的一个字符串
        }
        return $result;
    }
}

if (! function_exists('get_rand_str')) {
    /**
     * 获取随机字符串
     *
     * @param $length  字符串长度
     * @return string  随机字符串
     */
    function get_rand_str($length = 6)
    {
        // 密码字符集，可任意添加你需要的字符
        $str = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9');
        // 在 $str 中随机取 $length 个数组元素键名
        $keys = array_rand($str, $length);
        $res = '';
        for ($i = 0; $i < $length; $i++) {
            // 将 $length 个数组元素连接成字符串
            $res .= $str[$keys[$i]];
        }
        return $res;
    }
}

/**
 * 获取订单随机号
 * @param int $length  需要多长的订单号，传一个长度
 */
if (! function_exists('get_order_no')) {
    function get_order_no($length = 20)
    {
        $n = $length - 10;
        //1、年月日
        $date = date('Ymd');
        //2、基于微秒生成随机串
        $id = uniqid();
        //3、截取随机串的随机后7位
        $sub = substr($id, 7, 13);
        //4、将随机串分割成数组
        $str_arr = str_split($sub, 1);
        //5、转换成ASCLL值,并取第一位连接成字符串
        $ascll_arr = array_map('ord', $str_arr);
        $ascll_str = implode('', $ascll_arr);
        //6、随机取连续的4位
        $max_start_index = strlen($ascll_str) - 1 - 4;
        $start_index = rand(0, $max_start_index);
        $str = substr($ascll_str, $start_index, 4);
        //7、生成末尾的n位随机数
        $rand = mt_rand('1' . str_repeat('0', $n - 1), str_repeat('9', $n));
        $order = $date . $str . $rand;
        return $order;
    }
}

if (! function_exists('check_time_status')) {
    /**
     * 获取随机字符串
     *
     * @param $length  字符串长度
     * @return string  随机字符串
     */
    function check_time_status($beginTime, $endTime)
    {
        $currentTime = date('Y-m-d H:i:s');
        // 判断活动状态
        if ($currentTime < $beginTime) {
            $status = "未开始";
        } elseif ($currentTime >= $beginTime && $currentTime <= $endTime) {
            $status = "进行中";
        } else {
            $status = "已结束";
        }
        return $status;
    }
}